package cn.zero.letaomallspringboot.service.impl;

import cn.hutool.crypto.digest.BCrypt;
import cn.zero.letaomallspringboot.common.PageResult;
import cn.zero.letaomallspringboot.entity.User;
import cn.zero.letaomallspringboot.exception.CustomException;
import cn.zero.letaomallspringboot.mapper.UserMapper;
import cn.zero.letaomallspringboot.service.IUserService;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

@Service
public class UserService implements IUserService {

    private final UserMapper userMapper;

    public UserService(UserMapper userMapper) {
        this.userMapper = userMapper;
    }

    /**
     * 分页查询用户列表
     */
    public PageResult<User> getUserList(Map<String, Object> params) {
        // 1. 计算分页参数（page从1开始，offset = (page-1)*size）
        int page = Integer.parseInt(params.get("page").toString());
        int size = Integer.parseInt(params.get("size").toString());
        int offset = (page - 1) * size;
        params.put("offset", offset);

        // 2. 查询用户列表和总数
        List<User> userList = userMapper.selectUserList(params);
        long total = userMapper.selectUserCount(params);

        // 3. 封装分页结果
        return new PageResult<>(total, page, size, userList);
    }

    /**
     * 根据ID查询用户
     */
    public User getUserById(Long id) {
        if (id == null || id <= 0) {
            return null;
        }
        return userMapper.selectUserById(id);
    }

    /**
     * 根据手机号查询用户
     */
    public User getUserByPhone(String phone) {
        if (!StringUtils.hasText(phone)) {
            return null;
        }
        return userMapper.selectUserByPhone(phone);
    }

    /**
     * 验证密码是否正确
     * @param rawPassword 原始密码
     * @param encryptedPassword 加密后的密码
     * @return 是否匹配
     */
    public boolean verifyPassword(String rawPassword, String encryptedPassword) {
        if (!StringUtils.hasText(rawPassword) || !StringUtils.hasText(encryptedPassword)) {
            return false;
        }
        return BCrypt.checkpw(rawPassword, encryptedPassword);
    }

    /**
     * 新增用户（含参数校验和密码加密）
     */
    public boolean createUser(User user) {
        // 1. 基础参数校验
        if (!StringUtils.hasText(user.getPhone())) {
            throw new CustomException("手机号不能为空");
        }
        if (!StringUtils.hasText(user.getPassword())) {
            throw new CustomException("密码不能为空");
        }

        // 2. 校验手机号唯一性（避免重复注册）
        User existingUser = userMapper.selectUserByPhone(user.getPhone());
        if (existingUser != null) {
            throw new CustomException("该手机号已被注册");
        }

        // 3. 使用Hutool的BCrypt进行密码加密
        String encryptedPassword = BCrypt.hashpw(user.getPassword(), BCrypt.gensalt());
        user.setPassword(encryptedPassword);

        // 4. 补全默认值（若前端未传）
        if (!StringUtils.hasText(user.getNickname())) {
            // 默认昵称：用户+手机号后4位
            String defaultNickname = "用户" + user.getPhone().substring(user.getPhone().length() - 4);
            user.setNickname(defaultNickname);
        }
        if (!StringUtils.hasText(user.getAvatar())) {
            // 默认头像（使用数据库表定义的默认URL）
            user.setAvatar("https://and-static.ghzs.com/image/user/icon/default/default_icon_7.jpg");
        }
        if (user.getGender() == null) {
            user.setGender(0); // 0-未知
        }
        if (user.getUserStatus() == null) {
            user.setUserStatus(2); // 2-待验证（默认手机号未验证）
        }
        if (user.getRegisterTime() == null) {
            user.setRegisterTime(LocalDateTime.now()); // 默认当前时间注册
        }

        // 5. 插入数据库
        int rows = userMapper.insertUser(user);
        return rows > 0;
    }

    /**
     * 更新用户信息（不含密码）
     */
    public boolean updateUser(User user) {
        // 1. 校验ID（必须传）
        if (user.getId() == null || user.getId() <= 0) {
            throw new CustomException("用户ID不能为空");
        }

        // 2. 校验用户是否存在
        User existingUser = userMapper.selectUserById(user.getId());
        if (existingUser == null) {
            throw new CustomException("用户不存在");
        }

        // 3. 若更新邮箱，需校验邮箱唯一性
        if (StringUtils.hasText(user.getEmail()) && !user.getEmail().equals(existingUser.getEmail())) {
            // 此处需额外查询邮箱是否被其他用户占用
             User userByEmail = userMapper.selectUserByEmail(user.getEmail());
             if (userByEmail != null) throw new CustomException("该邮箱已被绑定");
        }

        // 4. 执行更新（仅更新非null字段，Mapper.xml已做动态判断）
        int rows = userMapper.updateUser(user);
        return rows > 0;
    }

    /**
     * 更新用户密码（支持原密码验证）
     */
    public boolean updateUserPassword(Long id, String oldPassword, String newPassword) {
        // 1. 基础校验
        if (id == null || id <= 0) {
            throw new CustomException("用户ID不能为空");
        }
        if (!StringUtils.hasText(oldPassword)) {
            throw new CustomException("原密码不能为空");
        }
        if (!StringUtils.hasText(newPassword)) {
            throw new CustomException("新密码不能为空");
        }

        // 2. 校验用户是否存在
        User existingUser = userMapper.selectUserById(id);
        if (existingUser == null) {
            throw new CustomException("用户不存在");
        }

        // 3. 验证原密码是否正确
        if (!verifyPassword(oldPassword, existingUser.getPassword())) {
            throw new CustomException("原密码不正确");
        }

        // 4. 使用Hutool的BCrypt加密新密码并更新
        String encryptedPassword = BCrypt.hashpw(newPassword, BCrypt.gensalt());
        User user = new User();
        user.setId(id);
        user.setPassword(encryptedPassword);

        int rows = userMapper.updateUserPassword(user);
        return rows > 0;
    }

    /**
     * 无需原密码更新用户密码（用于密码重置功能）
     */
    public boolean resetUserPassword(Long id, String newPassword) {
        // 1. 基础校验
        if (id == null || id <= 0) {
            throw new CustomException("用户ID不能为空");
        }
        if (!StringUtils.hasText(newPassword)) {
            throw new CustomException("新密码不能为空");
        }

        // 2. 校验用户是否存在
        User existingUser = userMapper.selectUserById(id);
        if (existingUser == null) {
            throw new CustomException("用户不存在");
        }

        // 3. 加密新密码并更新
        String encryptedPassword = BCrypt.hashpw(newPassword, BCrypt.gensalt());
        User user = new User();
        user.setId(id);
        user.setPassword(encryptedPassword);

        int rows = userMapper.updateUserPassword(user);
        return rows > 0;
    }

    /**
     * 更新用户状态（禁用/启用）
     */
    public boolean updateUserStatus(Long id, Integer userStatus) {
        // 1. 基础校验
        if (id == null || id <= 0) {
            throw new CustomException("用户ID不能为空");
        }
        if (userStatus == null || (userStatus != 0 && userStatus != 1 && userStatus != 2)) {
            throw new CustomException("用户状态无效（仅支持0-禁用、1-正常、2-待验证）");
        }

        // 2. 校验用户是否存在
        User existingUser = userMapper.selectUserById(id);
        if (existingUser == null) {
            throw new CustomException("用户不存在");
        }

        // 3. 执行状态更新
        User user = new User();
        user.setId(id);
        user.setUserStatus(userStatus);

        int rows = userMapper.updateUserStatus(user);
        return rows > 0;
    }

    /**
     * 根据ID删除用户
     */
    public boolean deleteUser(Long id) {
        if (id == null || id <= 0) {
            throw new CustomException("用户ID不能为空");
        }

        // 校验用户是否存在（避免删除不存在的记录）
        User existingUser = userMapper.selectUserById(id);
        if (existingUser == null) {
            throw new CustomException("用户不存在");
        }

        int rows = userMapper.deleteUserById(id);
        return rows > 0;
    }

    /**
     * 批量删除用户
     */
    public boolean batchDeleteUser(List<Long> ids) {
        if (ids == null || ids.isEmpty()) {
            throw new CustomException("请选择要删除的用户");
        }

        // 可选：批量校验用户是否存在（简化处理：直接删除，依赖数据库外键约束避免误删）
        int rows = userMapper.batchDeleteUser(ids);
        return rows > 0;
    }
}
